在說明完了Java所有的打包方式JAR、WAR、EAR後,你可能會再進一步思考如何將Java的應用程式打包成 Docker Image 來部署你的應用程式。今天我們就來看看如何透過Maven Plugin來幫我們完成這件事
mvn clean package
- Maven 打包docker build
- 建構 Docker Imagedocker push
- 推送到 Registrykubectl apply
- 部署至 Kubernetes插件 | 開發者 | 特色 | 適用場景 |
---|---|---|---|
jib-maven-plugin | 無需 Docker daemon,極快建構 | 雲原生應用,CI/CD 環境 | |
dockerfile-maven-plugin | Spotify | 基於 Dockerfile,簡單易用 | 已有 Dockerfile 的專案 |
docker-maven-plugin | fabric8io | 功能最豐富,支援複雜配置 | 企業級應用,複雜部署需求 |
註:以上由Claude AI整理
1.創建maven web專案
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.5
2.pom配置
<groupId>com.mycompany.demodocker</groupId>
<artifactId>demodocker</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<!--
Docker 常用指令
docker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
docker ps # 查看運行的 container
docker ps -a # 查看所有運行與未運行的 container
docker images # 查看現行的映像檔
docker rm <container_id> # 刪除 container
docker rmi <image_id> # 刪除 image
docker logs <container_id> # 查看 container 日誌
-->
<build>
<!-- 其他略 -->
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>3.4.0</version>
<configuration>
<from>
<image>tomcat:jre21</image>
</from>
<to>
<image>docker.io/mycompany/${project.artifactId}:${project.version}</image>
<!-- 如果要 push 到私有 registry -->
<!-- <auth> <username>xxx</username> <password>xxx</password> </auth> -->
</to>
<container>
<!-- 設置WAR部署路徑 -->
<appRoot>/usr/local/tomcat/webapps/ROOT</appRoot>
<jvmFlags>
<jvmFlag>-Xms512m</jvmFlag>
<jvmFlag>-Xmx1024m</jvmFlag>
</jvmFlags>
<ports>
<port>8080</port>
</ports>
<labels>
<version>${project.version}</version>
</labels>
</container>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<!-- 部署到local -->
<goal>dockerBuild</goal>
<!-- 部署到私人repository
<goal>jib:build</goal> -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.執行mvn package
完成本地端image創建
4.確認docker images
5. 執行docker rundocker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
1.修改pom設定
<build>
<!-- 其他略 -->
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.4.13</version>
<configuration>
<repository>mycompany/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.war</JAR_FILE>
</buildArgs>
</configuration>
<executions>
<execution>
<id>default</id>
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.創建Dockerfile
# 使用 Tomcat 作為基礎映像檔
FROM tomcat:jre21
# 移除預設的 webapps 內容
RUN rm -rf /usr/local/tomcat/webapps/*
# 複製 WAR 檔案到 Tomcat webapps/ROOT 目錄
ARG JAR_FILE
COPY ${JAR_FILE} /usr/local/tomcat/webapps/ROOT.war
# 設置 JVM 參數
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
# 暴露 8080 port
EXPOSE 8080
# 添加版本標籤
LABEL version="1.0-SNAPSHOT"
# 啟動 Tomcat
CMD ["catalina.sh", "run"]
3.執行mvn package
4.確認docker images
5. 執行docker rundocker run -d -p 8080:8080 mycompany/demodocker:1.0-SNAPSHOT
本章我們介紹了如何將Java Web專案使用 Maven plugin自動化建構 Docker Image並且在docker成功運行,明天來我們來看看Maven如何跟CI/CD工具進行整合